package 单例模式.register;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


//Spring中的做法，就是用这种注册式单例

/**
 * 容器式单例模式适用于实例非常多的情况，便于管理。
 * 但它在创建单例时是非线程安全的?  dubbo创建spi实例时貌似也是这样写的？
 *
 *  AbstractAutowireCapableBeanFactory spring的做法
 */
public class ContainerSingleton {
    private ContainerSingleton() {
    }

    private static Map<String, Object> ioc = new ConcurrentHashMap<>();

    public static Object getInstance(String className) {
        synchronized (ioc) {
            if (!ioc.containsKey(className)) {
                Object obj = null;
                try {
                    obj = Class.forName(className).newInstance();
                    ioc.put(className, obj);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return obj;
            } else {
                return ioc.get(className);
            }
        }
    }
}
